'use server'; import { NextResponse } from 'next/server'; import { OrderLogData, Test, TestResult, TestStat } from '@tradejs/types'; import { compactOrderLog, getTimeline } from '@tradejs/core/backtest'; import { parseBacktestArtifactRef, readPersistedBacktestOrderLog, } from '@tradejs/infra/backtestArtifacts'; import { getData, redisKeys } from '@tradejs/infra/redis'; import { logger } from '@tradejs/infra/logger'; import { auth } from '#app/auth'; interface Params { strategy: string; name: string; } export const GET = async ( _req: Request, { params }: { params: Promise }, ) => { try { const { name, strategy } = await params; if (!name || !strategy) { return NextResponse.json( { error: 'Missing required parameter: name/strategy' }, { status: 400 }, ); } const session = await auth(); const userName = session?.user?.id || session?.user?.name; if (!userName) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); } const storedOrderLog = await getData( redisKeys.testOrders(userName, strategy, name), ); const test: Test = await getData( redisKeys.testConfig(userName, strategy, name), ); const stat: TestStat = await getData( redisKeys.testStat(userName, strategy, name), ); const orderLogRef = parseBacktestArtifactRef(storedOrderLog); if (!orderLogRef) { return NextResponse.json( { error: 'Backtest order log not found' }, { status: 404 }, ); } const orderLog: OrderLogData | null = await readPersistedBacktestOrderLog({ userName, strategyName: strategy, testName: name, ref: orderLogRef, }); if (!orderLog) { return NextResponse.json( { error: 'Backtest order log not found' }, { status: 404 }, ); } // TODO: Validate test/test.options payload and return 404/422 instead of falling into 500 on malformed cache data. const timeline = getTimeline(test.options.start, test.options.end); const payload: TestResult = { test, orderLog: compactOrderLog(timeline, orderLog), stat, }; return NextResponse.json({ result: payload }); } catch (error) { logger.log('error', `Backtest load error: %o`, error); return NextResponse.json( { error: 'Internal Server Error' }, { status: 500 }, ); } };